import bwPowerSet from '@/utils/sku/power-set'
import {watchEffect,ref} from "vue";

export function useSku() {
    //skuID
    let skuIdObj: any = ref({})

    //生成有效(有库存的sku)的sku(有效的路径字典)
    function getValidSku(goods: any) { // 假设 skus 是一个数组
        const pathMap: object = {}; //有效字典对象
        //(1)生成有库存的sku
        let res = goods.skus.filter((item) => {
            return item.inventory > 0;
        });
        //(2)根据算法生成子集
        res.forEach(item => {
            // //2.1获取匹配的数据名(获取到商品数据)
            const selectedValArr = item.specs.map(val => val.valueName)
            //2.2将所有获取到的数据放进子集中（生成子集）
            const valueArrPowerSet = bwPowerSet(selectedValArr)
            //2.3生成路径字典对象
            valueArrPowerSet.forEach(arr => {
                //初始化key 数组join -> 字符串 然后作为对象的key（就是生成黑白--11这种类型的key）
                const key = arr.join('-')

                //判断里面是否有重复的key 如果有就在数组中添加skuid 如果没有做赋值
                if (pathMap[key]) {
                    //初始化key 数组join -> 字符串 然后作为对象的key（就是生成黑白--11这种类型的key 然后赋值上对应的di）
                    pathMap[key].push(item.id)
                } else {
                    pathMap[key] = [item.id]
                }
            })
        })
        return pathMap
    }

    // //初始化禁用状态判断是否存在库存
    function initDisable(specs: any, pathMap: any) {
        //外层
        specs.forEach(item => {
            //内层
            item.values.forEach(val => {
                //匹配上pathMap生成对象的类名
                if (pathMap[val.name]) {
                    val.disable = false
                } else {
                    //没有库存
                    val.disable = true
                }
            })
        })
    }

    // //切换规格时触发的函数
    function changeSku(item: any, val: any, detailData: any, skuMap: any) {
        //判断是否有库存
        if (val.disable) return
        if (val.selected) {
            val.selected = false
        } else {
            item.values.forEach(item1 => {
                item1.selected = false
            })
            val.selected = true
        }
        //动态修改库存判断是否存在
        updateSku(detailData.value.specs, skuMap)
        //产出有效的sku数据 根据生成数组进行查找 例如['蓝色','20cm','undefined']  有undefined说明信息不完整
        //(1)判断查找是否有undefined 如果没有找到-1（完整sku）  有则找到返回找到的那一项（不完整sku）
        const index = getSelectedSpecs(detailData.value.specs).findIndex(value => value === undefined)
        if (index > -1) {

        } else {
            //(2)获取sku对象 通过字典查找到对应的sukid//数组
            const skuId = skuMap[getSelectedSpecs(detailData.value.specs).join('-')]
            //(3)以skuId查找sku对象
            skuIdObj.value = detailData.value.skus.find(item => item.id === skuId[0]) //这里面有数据
        }
    }

    //
    //获取选中的规格的数组 ['蓝色','20cm','undefined']
    function getSelectedSpecs(specs: any) {
        const arr: any = []
        //外层得层数 两个大模块 证明就有 ['undefined','undefined']
        specs.forEach(item => {
            let res = item.values.find(val => val.selected)
            arr.push(res ? res.name : undefined)
        })
        return arr
    }

    //切换时更新状态
    function updateSku(specs, pathMap) {
        specs.forEach((item, index) => {
            //选种的选项 例如['蓝色','20cm','undefined']
            //selectedValue里面存得是查找item每一项后的得到得数组
            //生成类似于 ['undefined','undefined'] * 2数据
            const selectedValue = getSelectedSpecs(specs)
            item.values.forEach(val => {
                //获取每一项得名字 并赋值名字
                selectedValue[index] = val.name
                //筛选不为空 保持和字典一致便于查询
                const key = selectedValue.filter(value => value).join('-')
                //查询字典中是否存在
                if (pathMap[key]) {
                    val.disable = false
                } else {
                    val.disable = true
                }
            })
        })

    }


    return {
        getValidSku,
        initDisable,
        changeSku,
        skuIdObj
    }
}